/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import persistencia.exceptions.ExcepcionFachada;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.GregorianCalendar;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;

/**
 *
 * @author diego
 */
public class Fachada {

    private static Fachada instancia;

    public static Fachada getInstancia() {
        if (instancia == null) {
            instancia = new Fachada();
        }
        return instancia;
    }

    public Criteria crearCriterio(Class tipoObjeto) {
        Session s = null;
        s = Conexion.getInstancia().getSession();
        Criteria criteria = s.createCriteria(tipoObjeto);
        //criteria.add(Restrictions.eq("eliminado", false));
        return criteria;
    }

    public List buscar(Class tipoObjeto, Criteria criterio) {
        if (criterio == null) {
            criterio = crearCriterio(tipoObjeto);
        }
        return (new IntermediarioGenerico()).buscar(tipoObjeto, criterio);
    }

    public void guardar(ObjetoPersistente obj) throws ExcepcionFachada {
        try {
            (new IntermediarioGenerico()).guardar(obj);
        } catch (Exception ex) {

            throw new ExcepcionFachada("Error al guardar Objeto: " + obj.getClass().toString() + ", ID:" + obj.getId());
        }
    }

    public void eliminar(ObjetoPersistente obj) throws ExcepcionFachada {
        try {
            (new IntermediarioGenerico()).eliminar(obj);
        } catch (Exception ex) {

            throw new ExcepcionFachada("Error al guardar Objeto: " + obj.getClass().toString() + ", ID:" + obj.getId());
        }
    }

    public Date getFecha() {
        Timestamp fechaServidor = (Timestamp) (new IntermediarioGenerico()).getFecha();
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(fechaServidor);
        Date fecha = new Date(calendar.getTimeInMillis());
        return fecha;
    }

    /**
     * limpia la cache
     *
     * @param tipo si se envia un tipo particular quita todos los objetos de
     * dicho tipo de la cache
     */
    public void limpiarCache() {
        Conexion.getInstancia().limpiarCache();
    }
}
